#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>
#include<error.h>
#include<unistd.h>
#include<string>
#include<iostream>
#include<cstdlib>
#include<cstdio>


// 多进程方式
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        char *const argv[] = {
            (char*)"code",
            nullptr 
        };

        char *const env[] = {
            (char*)"hello=xlf1",
            (char*)"hello=xlf2",
            (char*)"hello=xlf3",
            (char*)"hello=xlf4",
        };
        //execvp(argv[0], argv);
        
        execvpe("./code", argv, env);// 手动传环境变量，即使用全新的环境变量
        exit(1);
    }

    pid_t rid = waitpid(id, nullptr, 0);
    if(rid > 0)
    {
        printf("等待子进程成功！\n");
    }
    return 0;
}


//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        execlp("ls", "ls", "--color", "-a", "-l", nullptr);
//        exit(1);
//    }
//
//    pid_t rid = waitpid(id, nullptr, 0); // 阻塞式等待
//    if(rid > 0)
//    {
//        printf("等待子进程成功！\n");
//    }
//
//    return 0;
//}


//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        char *argv[] = {
//            (char*)"ls",
//            (char*)"--color",
//            (char*)"-a",
//            (char*)"-l",
//            nullptr 
//        };
//        execv("/usr/bin/ls", argv);
//        exit(1);
//    }
//
//    pid_t rid = waitpid(id, nullptr, 0);
//    if(rid > 0)
//    {
//        printf("等待子进程成功！\n");
//    }
//    return 0;
//}


//int main()
//{
//    pid_t  id = fork();
//    if(id == 0)
//    {
//        sleep(3);
//        execl("bin/ls","ls", "-l","--color", "-a", nullptr);
//        exit(1);
//    }
//    pid_t rid = waitpid(id, nullptr, 0); // 阻塞式等待子进程
//    if(rid > 0)
//    {
//        printf("等待子进程成功！\n");
//    }
//    return 0;
//}


// 程序替换
//int main()
//{
//    //execl("/bin/ls", "ls", "-l", "-a", nullptr);
//    //execl("/usr/bin/top", "top", nullptr);
//    //printf("我是other进程， pid: %d\n",getpid());
//
//    printf("我是process, pid: %d\n", getpid());
//    //int n = execl("/bin/ls", "ls", "-l", "--color", "-a", nullptr);
//    int n = execl("/bin/lsss", "ssss", "-l", "--color", "-a", nullptr);
//    printf("execl return val: %d\n", n);
//
//    return 0;
//}




////进程等待
//// waitpid方法
//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        printf("error: %d, errstring: %s\n", error, strerror(errno));
//        return errno;
//    }
//    else if( id == 0) // 子进程退出后，父进程不管不顾，子进程就会变成僵尸进程，进而造成内存泄露
//    {
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("子进程运行中， pid: %d\n", getpid());
//            cnt--;
//            sleep(1);
//        }
//        exit(1);
//    }
//    else 
//    {
//        // 父进程阻塞在wait,子进程退出后继续
//        sleep(10);
//        //ipid_t rid = waitpid(-1, nullptr, 0);//-1 等待任意一个进程 == wait
//        //pid_t rid = waitpid(id + 1, nullptr, 0);//id 定向等待一个进程的pid
//      
//        int status = 0;
//        pid_t rid = waitpid(id, &status, 0);//id 定向等待一个进程的pid
//        if(rid > 0)
//        {
//           // if(WIFEXITED(status))
//            //{
//            //    printf("wait sub process success ,rid : %d, status code: %d\n",rid , WEXITSTATUS(status));// 查看进程退出码
//            //}
//            //else 
//            //{
//            //    printf("child process quit error!\n");
//            //}
//            printf("wait sub process success, rid: %d, status: %d\n", rid, status);
//        }
//        else 
//        {
//            perror("waitpid");
//        }
//        while(true)
//        {
//            printf("我是父进程， pid: %d\n", getpid());
//            sleep(1);
//        }
//    }
//    return 0;
//}

//// 父进程等待回收子进程的僵尸状态
//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        printf("error: %d, errstring: %s\n", error, strerror(errno));
//        return errno;
//    }
//    else if( id == 0) // 子进程退出后，父进程不管不顾，子进程就会变成僵尸进程，进而造成内存泄露
//    {
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("子进程运行中， pid: %d\n", getpid());
//            cnt--;
//            sleep(1);
//        }
//        exit(0);
//    }
//    else 
//    {
//        sleep(10);
//        pid_t rid = wait(nullptr);
//        if(rid > 0)
//        {
//            printf("wait sub process success, rid: %d\n", rid);
//        }
//        while(true)
//        {
//            printf("我是父进程， pid: %d\n", getpid());
//            sleep(1);
//        }
//    }
//    return 0;
//}


//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        printf("error: %d, errstring: %s\n", error, strerror(errno));
//        return errno;
//    }
//    else if( id == 0) // 子进程退出后，父进程不管不顾，子进程就会变成僵尸进程，进而造成内存泄露
//    {
//        int cnt = 10;
//        while(cnt)
//        {
//            printf("子进程运行中， pid: %d\n", getpid());
//            cnt--;
//            sleep(1);
//        }
//        exit(0);
//    }
//    else 
//    {
//        while(true)
//        {
//            printf("我是父进程， pid: %d\n", getpid());
//            sleep(1);
//        }
//    }
//    return 0;
//}



//// 进程终止
//void func()
//{
//    printf("hello world!\n");
//    _exit(23);// 定义进程的终止状态， 不会输出缓冲区的数据
//    exit(23);// 直接退出，表示当前进程结束， 直接把缓冲区的数据输出。
//    return 100; // 表示函数退出
//
//}
//
//int main()
//{
//    func();
//    printf("进程运行结束！\n");
//    return 0;
//}

//int main()
//{
//    std::cout << "hello world" << std::endl;
//
//    return 10;
//}

